home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1995-11-25 | 6.5 KB | 219 lines |
- IMPLEMENTATION MODULE CookieJar;
-
- FROM SYSTEM IMPORT ADDRESS,VAL,TSIZE;
- FROM MACHINE IMPORT SuperOn,SuperOff;
- FROM InOut IMPORT WriteString,WriteLn;
- FROM LongInOut IMPORT WriteLongCard;
-
- (*TYPE Cookie = RECORD
- CookieId : ARRAY [0..3] OF CHAR;
- CookieValue : LONGCARD;
- END(*RECORD*);*)
-
- PROCEDURE CreateCookie(VAR cookie:Cookie; id : ARRAY OF CHAR;
- value: LONGCARD );
- (* Initialisiert in der Variablen cookie einen Cookie;
- als weitere Parameter werden die Id des Coockies sowie
- dessen Wert übergeben *)
- BEGIN
- cookie.CookieId[0]:=id[0];
- cookie.CookieId[1]:=id[1];
- cookie.CookieId[2]:=id[2];
- cookie.CookieId[3]:=id[3];
- cookie.CookieValue:=value;
- END CreateCookie;
-
- PROCEDURE ccmp(c1,c2:Cookie):BOOLEAN;
- (* Nur um nicht StrCompare IMPORTieren zu müssen*)
- BEGIN
- IF (c1.CookieId[0]=c2.CookieId[0]) AND
- (c1.CookieId[1]=c2.CookieId[1]) AND
- (c1.CookieId[2]=c2.CookieId[2]) AND
- (c1.CookieId[3]=c2.CookieId[3]) THEN
- RETURN TRUE
- ELSE
- RETURN FALSE
- END(*IF*);
- END ccmp;
-
- PROCEDURE NewCookie(VAR Entry:Cookie):BOOLEAN;
- (* Trägt einen Neuen Cookie in den Jar ein.
- Achtung !
- Der Fall eines bereits vollen Jars wird hier nicht
- abgefangen. Es muss dann entsprechend Speicher ALLOCATEed
- und der ganze Jar umkopiert werden *)
- TYPE CookieJar = POINTER TO Cookie;
- VAR cookieJar, cookieJar1 : CookieJar;
- cookiePtr : POINTER TO CookieJar;
- cookieAdr :ADDRESS;
- actRow : LONGCARD;
- BEGIN
- SuperOn;
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookieJar:=cookiePtr^;
- SuperOff;
- actRow:=0D;
- IF cookieJar # NIL THEN
- cookieAdr:=cookieJar;
- WHILE cookieJar^.CookieId[0]#0C DO
- INC(actRow);
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar:=cookieAdr;
- END(*WHILE*);
- IF actRow<cookieJar^.CookieValue THEN
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar1:=cookieAdr;
- cookieJar1^:=cookieJar^;
- cookieJar^:=Entry;
- END(*IF*);
- END(*IF*);
- RETURN FALSE
- END NewCookie;
-
- PROCEDURE GetCookie(VAR cookie:Cookie):BOOLEAN;
- (* fragt den Wert eines Cookies ab.
- Als Parameter wird dabei die ID des zu suchenden Cookies
- übergeben.
- die Routine liefert FALSE wenn der Cookie nicht
- gefunden wurde; wenn er gefunden wurde
- wird TRUE zurückgegeben und der Wert des Cookies
- in cookie.CookieValue eingetragen *)
-
- TYPE CookieJar = POINTER TO Cookie;
- VAR cookieJar : CookieJar;
- cookiePtr : POINTER TO CookieJar;
- cookieAdr :ADDRESS;
- BEGIN
- SuperOn;
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookieJar:=cookiePtr^;
- SuperOff;
- IF cookieJar # NIL THEN
- cookieAdr:=cookieJar;
- WHILE ~ccmp(cookieJar^,cookie)
- AND ( cookieJar^.CookieId[0]#0C) DO
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar:=cookieAdr;
- END(*WHILE*);
- IF cookieJar^.CookieId[0]#0C THEN
- cookie:=cookieJar^; RETURN TRUE
- END(*IF*);
- END(*IF*);
- RETURN FALSE
- END GetCookie;
-
- PROCEDURE RemoveCookie(VAR id : ARRAY OF CHAR);
- (* entfernt den mit id bezeichneten Cookie aus dem CookieJar*)
- TYPE CookieJar = POINTER TO Cookie;
- VAR cookieJar,
- cookieJar1 : CookieJar;
- cookiePtr : POINTER TO CookieJar;
- cookieAdr :ADDRESS;
- cookie : Cookie;
- BEGIN
- CreateCookie(cookie,id,0D);
- SuperOn;
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookieJar:=cookiePtr^;
- SuperOff;
- IF cookieJar # NIL THEN
- cookieAdr:=cookieJar;
- WHILE ~ccmp(cookieJar^,cookie)
- AND (cookieJar^.CookieId[0]#0C) DO
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar:=cookieAdr;
- END(*WHILE*);
- WHILE cookieJar^.CookieId[0]#0C DO
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar1:=cookieAdr;
- cookieJar^:=cookieJar1^;
- cookieJar:=cookieAdr;
- END(*WHILE*);
- END(*IF*);
- END RemoveCookie;
-
- PROCEDURE MoveCookieJar(Destination : ADDRESS; size :LONGCARD);
- (* verschiebt Kompletten CookieJar an eine neue Speicherstelle.
- Als Parameter werden die neue ADDRESSe des Jars sowie seine Grösse
- d.h. die Anzahl der in ihn hineinpassenden Cookies übergeben *)
- TYPE CookieJar = POINTER TO Cookie;
- VAR cookieJar,
- NewCookieJar : CookieJar;
- cookiePtr(*,NewCookiePtr*) : POINTER TO CookieJar;
- cookieAdr,NewCookieAdr :ADDRESS;
-
- BEGIN
- SuperOn;
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookieJar:=cookiePtr^;
- SuperOff;
- NewCookieJar:=Destination;
- IF cookieJar # NIL THEN
- cookieAdr:=cookieJar;
- WHILE cookieJar^.CookieId[0]#0C DO
- NewCookieJar^:=cookieJar^;
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar:=cookieAdr;
- NewCookieAdr:=NewCookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- NewCookieJar:=NewCookieAdr;
- END(*WHILE*);
- NewCookieJar^.CookieId:=cookieJar^.CookieId;
- NewCookieJar^.CookieValue:=size;
-
- SuperOn;
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookiePtr:=Destination;
- SuperOff;
-
- END(*IF*);
- END MoveCookieJar;
-
- PROCEDURE CookieSize():LONGCARD;
- TYPE CookieJar = POINTER TO Cookie;
- VAR cookieJar : CookieJar;
- cookiePtr : POINTER TO CookieJar;
- cookieAdr :ADDRESS;
- BEGIN
- SuperOn;
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookieJar:=cookiePtr^;
- SuperOff;
- IF cookieJar # NIL THEN
- cookieAdr:=cookieJar;
- WHILE cookieJar^.CookieId[0]#0C DO
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar:=cookieAdr;
- END(*WHILE*);
- RETURN (cookieJar^.CookieValue);
- END(*IF*);
- RETURN 0D;
- END CookieSize;
-
- PROCEDURE PrintCookieJar;
- TYPE CookieJar = POINTER TO Cookie;
- VAR cookieJar : CookieJar;
- cookiePtr : POINTER TO CookieJar;
- cookieAdr :ADDRESS;
- BEGIN
- SuperOn;
- (* Zeiger auf CookieJar holen *)
- cookiePtr:=VAL(ADDRESS,05A0H);
- cookieJar:=cookiePtr^;
- SuperOff;
- (* Ist der CookieJar überhaupt vorhanden? *)
- IF cookieJar # NIL THEN
- cookieAdr:=cookieJar;
- WHILE cookieJar^.CookieId[0]#0C DO
- WriteString(cookieJar^.CookieId);
- WriteLongCard(cookieJar^.CookieValue,10);
- WriteLn;
- cookieAdr:=cookieAdr+VAL(ADDRESS,TSIZE(Cookie));
- cookieJar:=cookieAdr;
- END(*WHILE*);
- WriteString('Größe');
- WriteLongCard(cookieJar^.CookieValue,10);
- END(*IF*);
- END PrintCookieJar;
-
- END CookieJar.
-